#include <logbase.h>
#include <inttypes.h>

// 变量/常量	        分配地址空间	作用范围	                        作用周期
// 全局变量	            静态区	       整个进程，使用前需声明一下	          整个进程
// static静态全局变量	 静态区	        当前文件，使用前需声明一下	           整个进程
// 函数内静态变量	     静态区	        定义的函数，第一次调用函数进行初始化	 整个进程
// 局部变量	            栈区间	       函数内部	                           函数结束释放
// 动态分配	            堆区间	       整个进程。获得地址即可使用。需要释放。	手动释放，程序结束。
// 常量	               常量区	       跟变量一致，也有全局与局部。	参考变量。
// 程序	               程序区		

// 讲malloc

int32_t *globalPointer = NULL;

void freeGlobalPointor()
{
    if(globalPointer == NULL)
    {
        return;
    }
    // void free(void *__ptr)这是函数圆形，说明__ptr和globalPointer是不同的空间。因此free不能改变globalPointer值。
    free(globalPointer);
    // globalPointer释放后，globalPointer不变。不要访问其内容。
    logdebugc("&pointor=%p, pointer=%p", &globalPointer, globalPointer);
    globalPointer = NULL;
}
// static 修饰函数，表示函数只能在本文件使用。
static void mallocGlobalPointor()
{
    freeGlobalPointor();
    globalPointer = (int32_t *)malloc(sizeof(int32_t));
}

// inttypes.h 定义了通用头。c99标准。
int main(int argc, char **argv)
{
    mallocGlobalPointor();
    if(!globalPointer)
    {
        logerrorc("malloc error");
        return -1;
    }
    globalPointer[0] = 1;
    logdebugc("&pointor=%p, pointer=%p, value=%d", &globalPointer, globalPointer, globalPointer[0]);

    mallocGlobalPointor();
    if(!globalPointer)
    {
        logerrorc("malloc error");
        return -1;
    }
    globalPointer[0] = 2;
    logdebugc("&pointor=%p, pointer=%p, value=%d", &globalPointer, globalPointer, globalPointer[0]);

    freeGlobalPointor();
    return 1;
}


// 到现在可以看看林锐博士的几个关于指针问题。参考林锐博士<高质量CC++编程(完整).doc>
// 问题1
// void GetMemory(char *p)
// {
// p = (char *)malloc(100);
// }
// void Test(void) 
// {
// char *str = NULL;
// GetMemory(str); 
// strcpy(str, "hello world");
// printf(str);
// }

// 问题2
// char *GetMemory(void)
// {
// char p[] = "hello world";
// return p;
// }
// void Test(void)
// {
// char *str = NULL;
// str = GetMemory();   
// printf(str);
// }

// 问题3
// void GetMemory2(char **p, int num)
// {
// *p = (char *)malloc(num);
// }
// void Test(void)
// {
// char *str = NULL;
// GetMemory(&str, 100);
// strcpy(str, "hello"); 
// printf(str); 
// }

// 问题4
// void Test(void)
// {
// char *str = (char *) malloc(100);
//  strcpy(str, “hello”);
//  free(str); 
//  if(str != NULL)
//  {
//  strcpy(str, “world”); 
// printf(str);
// }
// }


